using System;
using System.Collections.Generic;
using Csla;
using Ent.AccesoDatos;
using System.Data;
using EntGuayasSLA.BL.Listas.Criterias;

namespace EntGuayasSLA.BL.Listas
{
    /// <summary>
    /// Estereotipo: ReadOnlyList
    /// Reponsabilidad: 
    /// Autor: Luis Cuenca
    /// Fecha: 6/17/2013 11:10:11 AM
    /// </summary>
    [Serializable]
    public class ItemLista :   ReadOnlyListBase<ItemLista, ItemInfo>
    {
        #region Authorization Rules

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowGet(typeof(ItemLista), "Role");
        }

        #endregion

        #region Factory Methods

        public static ItemLista GetItemListaCatId(string idCat)
        {
            var criterio = ItemCriteria.NewItemCriteria();
            criterio.CatalogoId = idCat;
            criterio.CodigoCatalogo = "";
            return DataPortal.Fetch<ItemLista>(criterio);
        }

        public static ItemLista GetItemListaCodigo(string codigo,string opcion)
        {
            var criterio = ItemCriteria.NewItemCriteria();
            criterio.CatalogoId = "";
            criterio.CodigoCatalogo = codigo;
            criterio.Opcion = opcion;
            return DataPortal.Fetch<ItemLista>(criterio);
        }
        public ItemLista()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void DataPortal_Fetch(ItemCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> 
                    {
                        new Parametro("ec_cat_id", criteria.CatalogoId),
                        new Parametro("ec_codigo", criteria.CodigoCatalogo),
                        new Parametro("ec_opcion", criteria.Opcion)
                    };
            DataSet datos = accesoDatos.EjecutarDataSet("\"LISTA_ITEMS\"", parametros);
            foreach (DataRow items in datos.Tables[0].Rows)
            {
                this.Add(ItemInfo.GetItemInfo(items));
            }
            //IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion

        public void CopyTo(ItemLista ListaItemsCopy, int index)
        {
            foreach(ItemInfo item in ListaItemsCopy)
            {
                 this.Insert(index, item);
            }
            
        }

        public void RemoveFromList(ItemLista ListaItems)
        {
            int index = 0;
            List<ItemInfo> list_copy = new List<ItemInfo>();
            foreach (ItemInfo item in ListaItems)
            {
                list_copy.Add(item);                
            }

            foreach (ItemInfo item in list_copy) // Display for verification
            {
                index = this.IndexOf(item);
                if (index!=-1)
                this.RemoveAt(index);
            }
            //
        }
    }

    /// <summary>
    /// Estereotipo: ReadOnlyChild
    /// Reponsabilidad: 
    /// Autor: Luis Cuenca
    /// Fecha: 6/17/2013 11:10:11 AM
    /// </summary>
    [Serializable]
    public class ItemInfo : ReadOnlyBase<ItemInfo>
    {
        #region Business Methods

        public Guid Id { get; internal set; }
        public string CatalogoId { get; internal set; }
        public string Codigo { get; internal set; }
        public int Orden { get; internal set; }
        public string Nombre { get; internal set; }
        public string Descripcion { get; internal set; }
        public string Opcion { get; internal set; }
        public string Ruta { get;  set; }
        public string ArchivoId { get; set; }
        #endregion

        #region Factory Methods

        internal static ItemInfo GetItemInfo(DataRow childData)
        {
            return DataPortal.FetchChild<ItemInfo>(childData);
        }

        private ItemInfo()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(DataRow childData)
        {
            Id = Guid.Parse(childData[0].ToString());
            CatalogoId = childData[1].ToString();
            Codigo = childData[2].ToString();
            Nombre = childData[3].ToString();
            Descripcion = childData[4].ToString();
            Opcion = childData[5].ToString();
            Orden = int.Parse(childData[6].ToString());
        }

        #endregion
    }
}
